#include "stm32f10x.h"
#include "myusart.h"



void USART1_Init(u32 bound){
    //1.时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);
    //GPIO初始化
    GPIO_InitTypeDef initDef;
    initDef.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入  读取数据
    initDef.GPIO_Pin=GPIO_Pin_10;
    initDef.GPIO_Speed=GPIO_Speed_50MHz; 
    GPIO_Init(GPIOA,&initDef);

    initDef.GPIO_Mode=GPIO_Mode_AF_PP;//浮空输入  读取数据
    initDef.GPIO_Pin=GPIO_Pin_9;
    GPIO_Init(GPIOA,&initDef);

     //对usart配置 初始化
     USART_InitTypeDef usartInit;
     usartInit.USART_BaudRate=bound;
     usartInit.USART_WordLength=USART_WordLength_8b;
     usartInit.USART_StopBits=USART_StopBits_1;
     usartInit.USART_Parity=USART_Parity_No;
     usartInit.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
     usartInit.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;


     USART_Init(USART1,&usartInit);

     USART_Cmd(USART1, ENABLE);
     //清空一下中断状态位
     USART_ClearFlag(USART1,USART_FLAG_RXNE);
     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
    //3.初始化NVIC
    NVIC_InitTypeDef nvicInit;
    nvicInit.NVIC_IRQChannel=USART1_IRQn;
    nvicInit.NVIC_IRQChannelCmd=ENABLE;
    nvicInit.NVIC_IRQChannelPreemptionPriority=2;
    nvicInit.NVIC_IRQChannelSubPriority=3;


    NVIC_Init(&nvicInit);

   
}
/*
     最高位 是是否接收完毕状态位
     1000  0000  0000  0000   =0x8000
     次高位 是否接收到回车状态位
     0100  0000  0000  0000   =0x4000

     0011  1111  1111  1111   =0x3FFF
                                             
什么时候数据是接受完毕：接收到了一个/r/n  数据接受完毕
     回车=0x0D
     换行=0x0a

*/

u16 USART1_RX_STA=0;  //用来去记录数据接收后再数据中存放的位置
u8 USART1_RX_BUF[USART1_REC_LEN]; //只是用来缓存接收到的数据
/*
 如果发送方 发送数据中间出现了换行 
 
 你好？/r
 我是熟人介绍的


*/

//中断处理函数
void USART1_IRQHandler(){
    u8 r;//记录接收到的数据
    if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
          //接收数据
          r=USART_ReceiveData(USART1);
          if((USART1_RX_STA&0x8000)==0){//接收未完成  就是看最高位是不是1 
               if(USART1_RX_STA&0x4000){//看看当前次高位 是不是1 
                    if(r!=0x0a){
                        USART1_RX_STA=0; 
                    }else{// /r/n  数据已经接收完毕 把最高位设置为1
                        USART1_RX_STA|=0x8000; 
                    }
               }else{//正常的数据解析
                   if(r==0x0d){//当前接收到了一个回车
                      //把次高位设置为   1
                      USART1_RX_STA|=0x4000;   
                   }else{//  就是一个普通的数据
                         //放到缓冲区中  
                       USART1_RX_BUF[USART1_RX_STA&0x3FFF]=r;  
                       USART1_RX_STA++;
                       if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;  

                   } 


               }

          }

    }
    



    

}



   